## Блокчейн

Ещё один ликбез [по](https://tjournal.ru/45754#comment1718763) [заявкам](https://tjournal.ru/45754#comment1718550) читателей, на этот раз касающийся темы блокчейна. Что это такое, как работает, что на основе этих идей можно построить, и так далее — всё, что вы хотели знать, но боялись спросить.

![](res/Z9JeUtv.png)

Люди, связанные с индустрией блокчейна, традиционно считают своё детище чем-то, существующим на границе технологической сингулярности, и, следовательно, слишком сложным для понимания простыми смертными. Поэтому, объясняя принципы работы, оперируют понятными гуманитарными понятиями, такими как «доверие», «уверенность», «подконтрольность» и т.д., тем самым только всех запутывая и ничего не объясняя на самом деле.

Я не разделяю этот подход. Считаю, что знание деталей технической реализации есть залог доверия к инструменту в целом, а умение воссоздать нечто подобное — лучший критерий глубокого понимания. Поэтому сегодня с вами кружок «очумелые ручки» и мы будем строить свой, простейший, концептуальный, но тем не менее полностью рабочий, блокчейн. Прямо у вас на компьютере, без начальной подготовки, буквально вручную мышкой. Этим я покажу, что на самом деле всё там очень просто, и доступно даже пятикласснику. Не верите? Просто читайте дальше. Но для этого сначала нужно пояснить, что такое хэш. Без этого никак, увы.

### Хэш

Это ключевое понятие в криптографии. Оно может означать, в зависимости от контекста, две вещи: функцию хэширования, или результат выполнения такой функции. Если совсем просто, хэш-функция — это алгоритм, который принимает на вход любые данные (файл, текст, картинка, двоичный код, ...) и генерирует из него последовательнсоть букв и цифр фиксированной длины. 

Генерирует при этом так, что одинаковые файлы ВСЕГДА дают в результате одинаковый хэш, а разные — в идеале, разный (случай, когда две разных последовательности входных данных дают одинаковые хэши, называется коллизией криптографической функции и считается уязвимостью).

![](res/7hHmyIk.jpg)

Хэш-функций существует [великое множество](https://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions), и для каждой из функций существует множество реализаций, но все они, строго говоря, делают одно и то же: позволяют гарантировать, что несколько файлов одинаковые, не имея на руках самих файлов.

А теперь, чтобы стало ещё понятнее, продемонстрирую на практике. Вбейте в гугле «sha256 онлайн» (именно эту функцию мы будем использовать во всех примерах). Поиграйтесь с ней, вбивая разные данные.

Например, хэш от TJournal — 7db3a63e07638d7c795ee95210497048a7cc976f98f11ca8d5e2fc10b4dc374f. А от tjournal — c3ea30a9f5a650ee53db452cf17209412abbcee72b264ebfb1c7fa49b57fd8c9. Снова от TJournal — снова 7db3a63e07638d7c795ee95210497048a7cc976f98f11ca8d5e2fc10b4dc374f. Вбейте данные сами в любом онлайн-калькуляторе, и вы получите ровно те же результаты, что и я: одинаковые для одинаковых строк, и разные — для разных.

### Сделай сам

Всё. Этих знаний уже достаточно чтобы создать простой блокчейн. Удивительно, правда? Блокчейн — цепочка криптографически связаных блоков. Давайте создадим первый «блок». В нём может быть что угодно, но мы уже придерживаемся аналогии с биткоином и транзакциями, поэтому будет тоже записывать денежные отношения.

Открываем ваш любимый блокнот и создаём первый файл:

```
Маша -> Ваня :: 10 рублей
Ваня -> Лиза :: 20 рублей
Маша -> Саша :: 50 рублей
```
![](res/HafBMEU.png)

Хэш тут не для чего считать, поэтому всё. Сохраняем его с именем 1.txt в специальной папочке. (FYI: В блокчейне криптовалют такой блок называется [Genesis block](https://en.bitcoin.it/wiki/Genesis_block), и да, там его тоже прописывают вручную) Сохранили? Идём на один из прежде нагугленных сайтов (можно догадаться, что настоящие блокчейны ни на какие сайты не ходят, а вызывают заранее запрограмированные в них функции, но для нашего простейшего случая сделаем всё вручную), и считаем хэш для этого файла.

У меня получилось 7f17d67621afd2a661bc0a552735745b8a2c424cff28e523b94f1d1b4615f591, у вас может получиться другое, в зависимости от содержимого файла, кодировки, лишних/недостающих пробелов/переносов и т.д. Совершенно не важно, что у вас получилось, сохраните эту строку.

Теперь создайте следуюий файл, и назовите его 2.txt. Запишите в него несколько новых «транзакций»:

```
Таня -> Катя :: 10 рублей
Макс -> Витя :: 10 рублей
```

И последней строчкой добавьте результат хэширования предыдущего файла. Вот так:

```
Таня -> Катя :: 10 рублей
Макс -> Витя :: 10 рублей
7f17d67621afd2a661bc0a552735745b8a2c424cff28e523b94f1d1b4615f591
```

Готово? Сохраняем, и считаем хэш уже от этого, нового файла ЦЕЛИКОМ. У меня получилось db45d94b529fbf8c5fb1decd89f5d0ff62bbca86a02bc4f943eac42ff33dd486.

![](res/eU1N5TJ.png)

По аналогии создаём третий файл:

```
Митя -> Тёма :: 90 рублей
Жора -> Вася :: 10 рублей
Анна -> Люда :: 60 рублей
db45d94b529fbf8c5fb1decd89f5d0ff62bbca86a02bc4f943eac42ff33dd486
```

И все последующие. Их может быть сколько угодно. В блокчейне биткоина состоянием на 27.06.17 — 473,011 блоков, в которых записана информация о почти 250 миллионах транзакций. Это много. [В 250 раз больше](https://tjournal.ru/43823) чем комментов на TJ с момента основания.

На правах «знаете ли вы, что?»: Цепочка биткоина действительно большая, и там не всё так радужно и гладко, как некоторым хотелось бы представлять. Например, даже в середине цепи [есть](https://github.com/bitcoin/bips/blob/master/bip-0050.mediawiki) прописанные и подтверждённые вручную блоки. Это не то чтобы компрометирует инструмент, но и скрывать сам факт было бы неправильно. Такие дела.

И снова к нашим баранам. Можете создать все файлы самостоятельно, а можете скачать мой [архив](https://drive.google.com/open?id=0B-PT5EZmSJ-YbHBYYXM2dzF4ejg) из 10 файлов и контрольного, содержащего только хэш последнего «блока» и ничего больше.

![](res/54sTQpa.png)

Блокчейн готов? Почти. Тело готово. Не хватает самого главного — функции проверки целостности, которая бы сказала, всё с ним в порядке, или же кто-то вмешивался в эти файлы. Мы можем проверить и вручную. Элементарно. Пройдитесь подряд по всем файлам, найдите хэш каждого и сравните с записанным в следующий по порядку файл значением. Если хотя бы один не сходится — значит цепь повреждена. Но удобнее и надёжнее это делать программными инструментами.

Я сделал наипримитивнейший [скриптик](https://pastebin.com/1rrtLeHJ) с пояснениями, можете посмотреть его по ссылке, а без пояснений он включён в вышеуказанных архив. Написан он на самом популярном в терминах проникновения языке в мире — баше, а значит у пользователей GNU/Linux, MacOS, Android (окружение Termux) — не возникнет проблем с запуском.

![](res/TLu2nt7.png)

Пользователям Windows можно посоветовать установить [cygwin](https://www.cygwin.com/) или [Linux subsystem for windows](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide), появившийся в Windows 10.

Итак, после запуска скрипта должны получить что-то вроде:

```
10 blocks
chain is flawless
final hash = 23cbc83ca6a2cf2e75ae5ca76fb087ef11ff36fb0065c301557c8152a5bc530f
```

![](res/57V9Q0O.png)

Это значит что всё в порядке, данные представлены в исходном виде, в цепь никто не вмешивался. Теперь попробуйте октрыть в блокноте любой файл и поменять что угодно: убрать пробел, изменить цифру, имя, добавить что-то... Результат повторного исполнения скрипта после подобных операций будет безкомпромисен:

```
chain is corrupted
```
Верните всё на место и цепь будет снова проходить проверку. Магия? Магия.

### Майнинг

Теперь, чтобы два раза не вставать, покажу майнинг. Не беспокойтесь, всё так же просто и на пальцах. С разрешения автора публикую самое гениально простое объяснение, которое видел в своей жизни, цитата:

```
Я тоже нихрена не понимаю, но в моей голове это выглядит так:

Есть монетка, она спрятана в коробочку, коробку можно открыть, если решить пример, который написан на коробочке, но таких коробочек миллиард, а монетка лежит только в одном.

Собственно для того, чтобы найти монетку, нам нужен миллион китайцев с калькуляторами, которые будут "майнить" монетку.

— Настя Иванова
```

Возьмём теперь нашу цепь и усложним её немного. Добавим в первую строку немного случайных данных: пусть это будет число из десяти цифр. В реализации блокчейна биткоина это поле называется [Nonce](https://en.bitcoin.it/wiki/Block_hashing_algorithm). Вот так:

```
0000000000
Маша -> Ваня :: 10 Рублей
Ваня -> Лиза :: 20 Рублей
Маша -> Саша :: 5 Рублей
```

Теперь идём на наш сайт и снова считаем хэш. У меня получилось 361d413d08c614ff63290943bb184aadaaaae84171caef4bfb2344a3223cd104. Но он не подходит. Как так? А вот так. В официальной документации биткоина (допустим) сказано, что для первых десяти блоков принимаются только хэши, начинающиеся с нуля, а остальные — не подходят, и все, включая саму программу [bitcoin core](https://bitcoin.org/en/bitcoin-core/) сочтут нас за жуликов, если мы сгенерируем такое. Ну ладно, говорим мы, и добавляем единичку к нашему числу (мы не можем предсказать заранее, какой хэш получится на выходе, кто сможет — получит [нобелевку](https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_P_%D0%B8_NP), так что самый тупой выход здесь одновременно и самый единственный). Получается 0000000001. Идём и хэшируем снова. 44364a819eca9616dd56c21f6ba9a570d8a27ca54b95f67585cd36da2e4bf9f6. Чёрт. Это может затянуться.

![](res/ckNqOYj.jpg)

Как хорошо что мы снова можем написать перебирающий [скрипт](https://pastebin.com/uq2dCdU6)! В нём две главные перменные: LENGTH — количество цифр подряд с начала, которые должны соответствовать критерию, и GOAL — чему именно эти цифры должны быть равны. Сложность подбора при этом растёт вместе с количеством символов экспоненционально. Запустите скрипт: ./block_mine.sh 1.txt и он отработает довольно быстро. Измените LENGTH на 3, и GOAL на 000, и вы заметите бегущие циферки. Замените LENGTH на 10, и GOAL на 0000000000 — и вы результатов выполнения на своём компьютере уже не дождётесь.

![](res/xVEZ9qa.png)

Я «намайнил» вам для примера [цепь](https://drive.google.com/open?id=0B-PT5EZmSJ-YN3pDLXlXRWlTQlE) со «сложностью», соответствующей правилу «три нуля в начале каждого хэша». Попробуйте подделать или подменить так, чтобы итоговый хэш непременно начинался с 000, и цепь при этом проходила проверку, не перемайнивая всю цепь от начала до конца. Отпишитесь о результатах в комментариях. Бгг.

Именно таким примитивным действом и является майнинг. «Профессиональные» блокчейны отличаются только количеством разных данных, которые хранятся в блоке, алгоритмом хэширования, и набором правил, которым должен соответствовать хэш. Всё. В целом всё разнообразие работает на основе тех самых принципов, что я описал. Только ещё и майнинг не во всех случаях обязателен. В большинстве случаев не обязателен, скажем так.

### Значит это легко подделать

Да, достаточно перемайнить всю цепь от начала до конца быстрее остальных, и если у вас в распоряжении станет больше блоков, соовтетсвующих условиям, чем у ведущих майнеров, сеть примет ваш вариант, и вы станете королём биткоина. Перемайнивайте. Удачи.

### При чём тут Биткоин

Если говорить в терминах понятных аналогий, идеи блокчейна — электричество, биткоин и прочие криптовалюты — лампочка над вашей головой. Биткоин всего лишь один из множества способов применения идей блокчейна, и даже, на мой взгляд, не самый важный.

Гораздо интереснее его экономическая сущность, и об этом стоит сказать подробнее. Во-первых, запомните, проанализируйте, или просто примите на веру: состоянием на сегодня это спекулятивный экономический пузырь. Это дефицитный товар, который покупают/добывают/приобретают преимущественно в рассчёте на быструю прибыль в краткосрочном периоде. Это не плохо и не хорошо, это привычная ситуация для любого фондового рынка, да и в целом для экономики. Интернет был таким же (гугл: [пузырь доткомов](https://ru.wikipedia.org/wiki/%D0%9F%D1%83%D0%B7%D1%8B%D1%80%D1%8C_%D0%B4%D0%BE%D1%82%D0%BA%D0%BE%D0%BC%D0%BE%D0%B2)).

![](res/MogEglp.png)

То есть воспринимать как игрушку, а не как средство накопления, быть готовым к обвалу в 2-10 раз меньше чем за сутки (или аналогичному взлёту, тут уж как повезёт), сглаживать риски портфелями, и так далее (да вы всё и без меня знаете, если работаете в сфере финансов или увлекаетесь игрой на бирже, а если не работаете и не увлекаетесь, лучший совет: не лезть, ждать стабилизации курса). Это не пост пиара биткоина, это ликбез по блокчейну, так что могу себе позволить сказать всё как есть, лол.

### Зачем это нужно

Тут по порядку, иначе совсем запутаемся. 

В: Зачем нужно разбивать цепь на блоки, если можно с сопоставимой степнью надёжности считать хэш прямо от всего большого файла?

О: Для того чтобы удобно было находить ошибки в цепи. Очень легко определить, какой блок повреждён, но невозможно выяснить, где именно закралась ошибка в огромном файле, зная только, что изменился его хэш.

В: Зачем вообще этот хэш? Разве просто передать данные недостаточно?

О: Гугл: [Задача византийских генералов](https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B2%D0%B8%D0%B7%D0%B0%D0%BD%D1%82%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2). Вкратце, это когда нужно убедиться, что данные не повреждены и не изменены в условиях скомпрометированного канала их передачи. Ещё полвека назад эта задача считалась концептуально нерешаемой, а сейчас ЭЦП в паре с секретным ключом — [стандарт](http://zakon2.rada.gov.ua/laws/show/852-15) даже в консервативной сфере госуслуг. То есть эти «хэши» давно прочно проникли в нашу жизнь, им доверяют и ими пользуются. Если вы ещё не в курсе, что оно и как работает, это только ваша проблема.

В: Хорошо-хорошо, а где используется блокчейн, кроме нашумевших криптовалют?

О: Распределённые [базы данных](https://www.bigchaindb.com/), виртуальный каталог книг [project Alexandria](http://projectalexandria.net/), [социальные сети](https://www.synereo.com/), [платформы для голосования](https://followmyvote.com/online-voting-platform-faqs/) (согласитесь, приятно было бы знать, что подтасовка результатов выборов невозможна математически), и даже эксперимент по имплементации подобия госуслуг и государства [Bitnation](https://bitnation.co/). Венчурные проекты появляются как грибы после дождя. 

На самом деле это тема тянет на ещё одну статью, которая может даже появится, если мне того захочется, и если людям будет интересно. Не знаю. Если дочитали до этого места — сообщите в комментах, интересно вам продолжение или нет.

Большинcтво из них умрут (как уже умерла краудфандинговая платформа Koinify, как с треском провалилась из-за найденной уязвимости инвестиционная платформа [The DAO](https://tjournal.ru/45762-profil-vitalik-buterin), как умерло большинство известных на заре интернета сайтов). Однако это перспективная отрасль, которая сделала возможными некоторые ранее немыслимые вещи, и вполне вероятно, блокчейн-лихорадка — новый виток прогресса, похожий на историю упомянутого ранее, и сегодня всеми любимого World Wide Web.

В: Зачем мне это всё, я не программист?

О: Для меня этот вопрос звучит так же странно, как и «Зачем мне читать и писать, я не писарь?». Программирование это не профессия и не особый талант, это всего лишь немного более гибкий и мощный способ использования вашего компьютера — вот и всё. Его не нужно бояться или избегать, как чего-то «сложного». И да, я считаю, что в будущем, не таком далёком как кажется, сама идея специального человека, набирающего код, станет такой же абсурдной, как идея специального человека, переписывающего от руки книги. Это будут во-первых, уметь все с первого класса школы, во-вторых появятся более эффективные инструменты для профессиональной реализации нужных идей.

В: Зачем было всё это писать?

О: [Затем](http://i.imgur.com/8lVghx6.jpg). 

### Послесловие

Как и в прошлый раз, тема не раскрыта полностью по причине tl;dr, моей лени, обширности самой темы, да и всего в общем сразу. Что заинтересовало, что не понятно, заметили ошибку — пишите в комментариях. Я, как обычно, отвечаю на все вопросы, и признаю/исправляю ошибки. Все мы люди, все имеем на них право.

PS: Спасибо за моральную и информационную поддержку [Alex Kotenko](https://tjournal.ru/users/70808), спасибо за проверку текста на понятность обывателю [Musalav Alibekov](https://tjournal.ru/users/123408/posts/club). Без этих ребят всё было бы намного хуже.